//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "CComboModele.h"
#pragma link "CComboBx"
#pragma package(smart_init)
#include "CAccesCourrier.h"
#include "uParamCourrierEtCarnAdr.h" //Pour GetRepsCourrier
#include "MTAG_CtrlStd.h"

#define MODULE_TAG MTAG_COMBOMODELE
//---------------------------------------------------------------------------
// ValidCtrCheck est utilisé est utilisé pour être sûr que les composants créés n'ont
// aucune fonction virtuelle pure.
//

static inline void ValidCtrCheck(CComboModele *)
{
  new CComboModele(NULL);
}

namespace Ccombomodele
{
  void __fastcall PACKAGE Register()
  {
     TComponentClass classes[1] = {__classid(CComboModele)};
     RegisterComponents("EIC Ctrlstd", classes, 0);
  }
}
//---------------------------------------------------------------------------
__fastcall CComboModele::CComboModele(TComponent* Owner)
  : CCustomComboBox(Owner)
{
  if (ComponentState.Contains(csDesigning)) return;
  AnsiString aFileNameEicEdito;
  try
    {
    hEditeur = NULL;
    GetRepsCourrier(&aFileNameEicEdito);
    aFileNameEicEdito += NOM_DLL_EDITEUR;
    if((hEditeur = LoadLibrary(aFileNameEicEdito.c_str())) == NULL)
      throw EAbort("Librairie "+ aFileNameEicEdito + " absente");

    FOnDrawItem = NULL;
    FOnSortCompare = NULL;
    FOnChange = NULL;

    inherited::OnChange = FctOnChange;
    inherited::OnDrawItem = FctOnDrawItem;

    }
  catch (Exception &e)
    {
    EICDisplayException(TAG(10),e);
    }
}
//---------------------------------------------------------------------------
__fastcall CComboModele::~CComboModele()
{
  FreeLibrary(hEditeur);
}
//---------------------------------------------------------------------------
void __fastcall CComboModele::WMAddString(TMessage &Msg)
{
   inherited::Dispatch(&Msg);
   ItemIndex = Index;
}
//---------------------------------------------------------------------------

void __fastcall CComboModele::WMDestroy(TMessage &Msg)
{
   Clear();
   inherited::Dispatch(&Msg);
}
//---------------------------------------------------------------------------
void __fastcall CComboModele::SetLogiciel(const AnsiString  aLogiciel)
{
  FLogiciel = aLogiciel;
  Remplir();
}
//---------------------------------------------------------------------------

void __fastcall CComboModele::SetCategorie(const AnsiString  aCategorie)
{
  FCategorie = aCategorie;
  Remplir();
}
//---------------------------------------------------------------------------

void __fastcall CComboModele::SetSorted(bool  bSorted)
{
 FSorted = bSorted;
 if(FSorted) Trier();
}
//---------------------------------------------------------------------------
void __fastcall CComboModele::SetModeleDefaut(const AnsiString  aModeleDefaut)
{
 FModeleDefaut = aModeleDefaut;
 ItemIndex = Items->IndexOf(aModeleDefaut);
 if(ItemIndex != -1)
    {
    Index = ItemIndex;
    SignalerUtilisationDuModele();
    }
 }
//---------------------------------------------------------------------------
void __fastcall CComboModele::Trier()
{
  bool Modif;
  try
    {
    if(!FOnSortCompare) return;
    do
      {
      Modif = false;
      for(int i = 0; i < Items->Count; i++)
        {
        if(FOnSortCompare((TDescriptifModele &)Items->Objects[i], (TDescriptifModele &)Items->Objects[i+1]) > 0)
          {
          Items->Move(i, i+1);
          Modif = true;
          }
        }
      }while(Modif);
    }
catch(Exception &e)
   {
   EICDisplayException(TAG(20), e);
   }
}
//---------------------------------------------------------------------------

TStrings* __fastcall CComboModele::GetItems()
{
  return( inherited::Items );
}

/*******************************************************************************
void __fastcall CComboModele::Remplir()

Fonction : Remplit le combobox avec les courriers correspondant selon le logiciel
           et la catégorie choisi

Paramètres d'entrée :

Paramètres de sortie :

Valeur retournée :
*******************************************************************************/
void __fastcall CComboModele::Remplir()
{
  TStringList *ListeDesCourriers = NULL;
  TDescriptifModele DescriptionModele;
  CAccesCourrier *CAccesCourrier1 = NULL;
  Index = -1;

  try
    {
    if (ComponentState.Contains(csDesigning))
       return;

    Clear();

    if (FLogiciel.IsEmpty() || FCategorie.IsEmpty()) //L'affichage multi-logiciel/multi-catégorie n'est pas encore géré
       return;

    CAccesCourrier1 = new CAccesCourrier(NULL);
    ListeDesCourriers = new TStringList();
    if (CAccesCourrier1->ListeModelesEditeur(FLogiciel, FCategorie, ListeDesCourriers))
      {
     for (int i = 0; i <= ListeDesCourriers->Count -1; i++)
        {
        CAccesCourrier1->AnsiStringToTDescriptifModele(ListeDesCourriers->Strings[i], &DescriptionModele);

        Items->Add(DescriptionModele.aLibelle);
        if ( strcmp (FModeleDefaut.c_str(), DescriptionModele.aLibelle.c_str() ) == 0 ) Index = i;
        }
      if(Items->Count)
         {
         ItemIndex = Index;
         SignalerUtilisationDuModele();
         }
      }
    }
  catch (Exception &e)
    {
    EICDisplayException(TAG(30),e);
    }
  delete CAccesCourrier1;
  delete ListeDesCourriers;
}
//---------------------------------------------------------------------------
void __fastcall CComboModele::FctOnChange(System::TObject* Sender)
{
  try
    {
    if (FOnChange)
       FOnChange(Sender);

    SignalerUtilisationDuModele();
    }
  catch (Exception &e)
    {
    EICDisplayException(TAG(50),e);
    }
}
//---------------------------------------------------------------------------
void __fastcall CComboModele::FctOnDrawItem(Controls::TWinControl* Control, int Index,
                                            const Windows::TRect &Rect, TOwnerDrawState State)
{
  try
    {
    if (FOnDrawItem)
       {
       CAccesCourrier *CAccesCourrier1 = NULL;
       TDescriptifModele DescriptionModele;

       CAccesCourrier1 = new CAccesCourrier(NULL);
       CAccesCourrier1->GetDescriptifModele(FLogiciel,
                                            FCategorie,
                                            Items->Strings[Index],
                                            &DescriptionModele);

       FOnDrawItem(Control, Index, Rect, State, DescriptionModele);
       delete CAccesCourrier1;        CAccesCourrier1 = NULL;
       }
    }
  catch (Exception &e)
    {
    EICDisplayException(TAGL,e);
    }
}
//---------------------------------------------------------------------------

TDescriptifModele CComboModele::GetDescriptifModele()
{
  CAccesCourrier *CAccesCourrier1 = NULL;
  TDescriptifModele DescriptionModele;
  try
    {
    CAccesCourrier1 = new CAccesCourrier(NULL);
    CAccesCourrier1->GetDescriptifModele(FLogiciel,
                                        FCategorie,
                                        Items->Strings[ItemIndex],
                                        &DescriptionModele);
    }
  catch (Exception &e)
    {
    EICDisplayException(TAGL,e);
    }
  delete CAccesCourrier1;        CAccesCourrier1 = NULL;
  return DescriptionModele;
}

/*******************************************************************************

Fonction :

Paramètres d'entrée :

Paramètres modifiés :

Valeur retournée :
*******************************************************************************/
void __fastcall CComboModele::SignalerUtilisationDuModele()
{
try
   {
   if (!ComponentState.Contains(csDesigning) && FIDModele >= 0 && ItemIndex != -1)
      {
      CAccesCourrier *CAccesCourrier1 = NULL;
      TDescriptifModele DescriptionModele;

      CAccesCourrier1 = new CAccesCourrier(NULL);
      if (CAccesCourrier1->GetDescriptifModele(FLogiciel,
                                               FCategorie,
                                               Items->Strings[ItemIndex],
                                               &DescriptionModele))
         CAccesCourrier1->SignalerUtilisationDuModele(FIDModele, DescriptionModele.aLogiciel, DescriptionModele.aCategorie, DescriptionModele.aLibelle, FRepDossier);
      delete CAccesCourrier1;        CAccesCourrier1 = NULL;
      }
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(80), e);
   }
}

